﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using System.Collections;
using Proxy;
using System.Web.Services;
using System.Text;
using SIM.Util;

namespace SIM.Geo.UI.Geo
{
    public partial class frmPuntoTopografico : PageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.rgLista.ClientSettings.Scrolling.ScrollHeight = int.Parse(System.Configuration.ConfigurationManager.AppSettings["listaPrincipalScrollHeight"]);
                //menor y mayor (cota mayor y menor) validarl las cajas de texto
                CargarCombos();
                Listar();
            }
            if (this.hidCodigoLabor.Value.CompareTo(this.hidDato.Value) != 0)
            {
                this.hidCodigoLabor.Value = this.hidDato.Value;
                Listar();
                CargarLabor();
            }
        }

        #region Metodos
        private void CargarLabor()
        {
            try
            {
                using (SELaborClient proxyLabor = new SELaborClient("BasicHttpBinding_ISELabor"))
                {
                    var labor = proxyLabor.Obtener(int.Parse(this.hidCodigoLabor.Value.ToString()));
                    if (labor != null)
                    {
                        this.hidCodigoLabor.Value = labor.CodigoLabor.ToString();
                        this.hidDato.Value = labor.CodigoLabor.ToString();
                        this.lblLabor.Text = labor.NombreLabor;
                        this.searchBoxLabor.Text = labor.NombreLabor;
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("Punto Topografico:CargarLabor", ex);
            }

        }
        protected override void Listar()
        {
            try
            {
                using (var proxy = new SEPuntoTopograficoClient("BasicHttpBinding_ISEPuntoTopografico"))
                {
                    var lista = proxy.ListarPuntoTopografico();
                    this.rgLista.DataSource = lista;

                    this.rgLista.DataBind();
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmPuntoTopografico:Listar", ex);
            }
        }

        private void CargarCombos()
        {
            try
            {
                using (SEUnidadMineraClient proxy = new SEUnidadMineraClient("BasicHttpBinding_ISEUnidadMinera"))
                {
                    this.Bind(this.ddlUnidadMinera, proxy.ObtenerListItem().ToList());
                    this.ddlUnidadMinera.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmPuntoTopografico:CargarCombos", ex);
            }
        }

        protected override void Limpiar()
        {
            this.hidCodigo.Value = "0";
            this.txtCodigo.Text = string.Empty;
            this.searchBoxLabor.Text = string.Empty;

            this.ddlUnidadMinera.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();

            this.txtNombre.Text = string.Empty;
            this.txtEste.Value = 0;
            this.txtNorte.Value = 0;
            this.txtCotaTecho.Value = 0;
            this.txtCotaPiso.Value = 0;
            this.txtObservacion.Text = string.Empty;

            this.hidCodigoLabor.Value = "0";
            this.hidDato.Value = "0";
            this.lblLabor.Text = string.Empty;

            OcultarMensaje();
            OcultarMensajeValidacion();
        }

        private void Habilitar(bool estado = true)
        {
            //this.txtCodigo.Enabled = estado;
            this.txtNombre.Enabled = estado;
            this.searchBoxLabor.Enabled = estado;

            this.ddlUnidadMinera.Enabled = estado;
            this.txtEste.Enabled = estado;
            this.txtNorte.Enabled = estado;
            this.txtCotaTecho.Enabled = estado;
            this.txtCotaPiso.Enabled = estado;
            this.txtObservacion.Enabled = estado;
            this.ibtnGuardar.Visible = estado;
            this.ibtnConsultar.Enabled = estado;
            if (!estado)
                this.ibtnConsultar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
            else
                this.ibtnConsultar.ToolTip = "Consultar Labor";


        }

        private void MostrarDetalle(int codigoPuntoTopografico, enmAccionRealizar accionRealizar)
        {

            try
            {
                this.hidCodigo.Value = codigoPuntoTopografico.ToString();
                if (accionRealizar == enmAccionRealizar.Edicion)
                {
                    //Carga detalla de pantalla en modo Edicion
                    this.CargarDatos(codigoPuntoTopografico);
                    Habilitar(true);
                }
                else if (accionRealizar == enmAccionRealizar.Ver)
                {
                    //Carga detalla de pantalla en modo Consulta
                    this.CargarDatos(codigoPuntoTopografico);
                    Habilitar(false);
                }
                else if (accionRealizar == enmAccionRealizar.Nuevo)
                {
                    //Carga detalla de pantalla en modo Nuevo
                    Limpiar();

                    using (var proxy = new SEPuntoTopograficoClient("BasicHttpBinding_ISEPuntoTopografico"))
                    {
                        this.txtCodigo.Text = proxy.GenerarCodigoPuntoTopografico().ToString();
                    }
                    Habilitar(true);
                }

                OcultarMensaje();
                OcultarMensajeValidacion();

                this.mpRegistro.Show();
            }
            catch (Exception ex)
            {

                Logger.Error("frmPuntoTopografico:MostrarDetalle", ex);
            }
        }

        private void CargarDatos(int codigoPuntoTopografico)
        {
            try
            {

                using (var proxy = new SEPuntoTopograficoClient("BasicHttpBinding_ISEPuntoTopografico"))
                {
                    var item = proxy.ObtenerPuntoTopografico(codigoPuntoTopografico);
                    if (item != null)
                    {
                        this.txtCodigo.Text = item.CodigoPuntoTopografico.ToString();
                        this.txtNombre.Text = item.Nombre.ToString();
                        this.txtEste.Text = item.Este.ToString();
                        this.txtNorte.Text = item.Norte.ToString();
                        this.txtCotaTecho.Text = item.CotaTecho.ToString();
                        this.txtCotaPiso.Text = item.CotaPiso.ToString();
                        this.txtObservacion.Text = item.Observacion.ToString();
                        this.ddlUnidadMinera.SelectedValue = item.CodigoUnidad.ToString();

                        if (item.CodigoLabor != null)
                        {
                            this.hidCodigoLabor.Value = item.CodigoLabor.ToString();
                            this.hidDato.Value = item.CodigoLabor.ToString();
                            using (SELaborClient proxyLabor = new SELaborClient("BasicHttpBinding_ISELabor"))
                            {
                                var labor = proxyLabor.Obtener((int)item.CodigoLabor);
                                if (labor != null)
                                {
                                    this.lblLabor.Text = labor.NombreLabor;
                                    this.searchBoxLabor.Text = labor.NombreLabor;
                                }
                            }
                        }
                        else
                        {
                            this.hidCodigoLabor.Value = "0";
                            this.lblLabor.Text = string.Empty;
                        }
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmEstructura:CargarDatos", ex);
            }
        }

        protected void searchBoxLabor_Search(object sender, SearchBoxEventArgs e)
        {
            this.searchBoxLabor.Text = string.Empty;
            this.hidDato.Value = "0";
            this.hidCodigoLabor.Value = "0";
            this.lblLabor.Text = string.Empty;

            if (e.Value != null)
            {
                this.searchBoxLabor.Text = e.Text;
                this.lblLabor.Text = e.Text;
                this.hidDato.Value = e.Value;
                this.hidCodigoLabor.Value = e.Value;
            }
        }

        [WebMethod]
        public static List<SearchBoxData> GetResults(SearchBoxContext context)
        {
            List<SearchBoxData> data = null;
            try
            {
                using (SELaborClient proxy = new SELaborClient("BasicHttpBinding_ISELabor"))
                {
                    var lista = proxy.Buscar(context.Text).ToList();
                    data = lista.Select(x => new SearchBoxData { Value = x.CodigoLabor.ToString(), Text = x.NombreLabor }).ToList();
                }


            }
            catch (Exception ex)
            {

                Logger.Error("PuntoTopografico:GetResults", ex);
            }
            return data;
        }
        #region Mensajes
        protected override void MostrarMensajeValidacion(string mensaje)
        {
            this.pnlMensajeValidacion.Visible = true;
            this.lblMensajeValidacion.Text = mensaje;
        }

        protected override void OcultarMensajeValidacion()
        {
            this.pnlMensajeValidacion.Visible = false;
            this.lblMensajeValidacion.Text = string.Empty;
        }

        protected override void MostrarMensaje(string mensaje, enmTipoMensajeMostrar tipoMensaje = enmTipoMensajeMostrar.Informativa)
        {
            this.pnlMensaje.Visible = true;
            this.lblMensaje.Text = mensaje;
            this.pnlMensaje.CssClass = this.ObtenerEstiloMensaje(tipoMensaje);
        }

        protected override void OcultarMensaje()
        {
            this.pnlMensaje.Visible = false;
            this.lblMensaje.Text = string.Empty;
        }

        #endregion

        protected override bool Validar(ref  StringBuilder sb)
        {
            bool retorno = true;
            try
            {

                //Validamos el Labor que sea obligario
                if (string.IsNullOrEmpty(this.lblLabor.Text))
                {
                    sb.AppendLine("No ha seleccionado Labor. El campo es obligatorio.");
                    retorno = false;
                }

                //Validando Rango Este
                double este = double.Parse(this.txtEste.Text);

                //var zona = proxy.ObtenerZona(int.Parse(this.ddlZona.SelectedValue.ToString()));
                using (SEUnidadMineraClient proxyUM = new SEUnidadMineraClient("BasicHttpBinding_ISEUnidadMinera"))
                {
                    var unidadMinera = proxyUM.ObtenerUnidadMinera(int.Parse(this.ddlUnidadMinera.SelectedValue.ToString()));
                    if (unidadMinera != null)
                    {
                        if (este < unidadMinera.RangoInicialEste || este > unidadMinera.RangoFinalEste)
                        {
                            sb.AppendLine("El Rango Este no puede exceder, el rango permitido es " + unidadMinera.RangoInicialEste.ToString() + " al " + unidadMinera.RangoFinalEste.ToString());
                            retorno = false;
                        }
                    }
                    else
                    {
                        sb.AppendLine("El Rango Este requiere definición de unidad minera. Defina los rangos este de unidad minera");
                        retorno = false;
                    }
                }

                //Validando Rango Norte
                double norte = double.Parse(this.txtNorte.Text);

                //var zona = proxy.ObtenerZona(int.Parse(this.ddlZona.SelectedValue.ToString()));
                using (SEUnidadMineraClient proxyUM = new SEUnidadMineraClient("BasicHttpBinding_ISEUnidadMinera"))
                {
                    var unidadMinera = proxyUM.ObtenerUnidadMinera(int.Parse(this.ddlUnidadMinera.SelectedValue.ToString()));
                    if (unidadMinera != null)
                    {
                        if (norte < unidadMinera.RangoInicialNorte || norte > unidadMinera.RangoFinalNorte)
                        {
                            sb.AppendLine("El Rango Norte no puede exceder, el rango permitido es " + unidadMinera.RangoInicialNorte.ToString() + " al " + unidadMinera.RangoFinalNorte.ToString());
                            retorno = false;
                        }
                    }
                    else
                    {
                        sb.AppendLine("El Rango Norte requiere definición de unidad minera. Defina los rangos norte de unidad minera");
                        retorno = false;
                    }
                }

                //Validando Rango Norte
                double cotatecho = double.Parse(this.txtCotaTecho.Text);

                //var zona = proxy.ObtenerZona(int.Parse(this.ddlZona.SelectedValue.ToString()));
                using (SEUnidadMineraClient proxyUM = new SEUnidadMineraClient("BasicHttpBinding_ISEUnidadMinera"))
                {
                    var unidadMinera = proxyUM.ObtenerUnidadMinera(int.Parse(this.ddlUnidadMinera.SelectedValue.ToString()));
                    if (unidadMinera != null)
                    {
                        if (cotatecho < unidadMinera.RangoInicialCota || cotatecho > unidadMinera.RangoFinalCota)
                        {
                            sb.AppendLine("El Rango Cota no puede exceder, el rango permitido es " + unidadMinera.RangoInicialCota.ToString() + " al " + unidadMinera.RangoFinalCota.ToString());
                            retorno = false;
                        }
                    }
                    else
                    {
                        sb.AppendLine("El Rango Cota requiere definición de unidad minera. Defina los rangos cota de unidad minera");
                        retorno = false;
                    }
                }

                double cotapiso = double.Parse(this.txtCotaPiso.Text);

                //var zona = proxy.ObtenerZona(int.Parse(this.ddlZona.SelectedValue.ToString()));
                using (SEUnidadMineraClient proxyUM = new SEUnidadMineraClient("BasicHttpBinding_ISEUnidadMinera"))
                {
                    var unidadMinera = proxyUM.ObtenerUnidadMinera(int.Parse(this.ddlUnidadMinera.SelectedValue.ToString()));
                    if (unidadMinera != null)
                    {
                        if (cotapiso < unidadMinera.RangoInicialCota || cotapiso > unidadMinera.RangoFinalCota)
                        {
                            sb.AppendLine("El Rango Cota no puede exceder, el rango permitido es " + unidadMinera.RangoInicialCota.ToString() + " al " + unidadMinera.RangoFinalCota.ToString());
                            retorno = false;
                        }
                    }
                    else
                    {
                        sb.AppendLine("El Rango Cota requiere definición de unidad minera. Defina los rangos cota de unidad minera");
                        retorno = false;
                    }
                }
            }
            catch (Exception ex)
            {
                retorno = false;
                Logger.Error("frPuntoTopografico:Validar", ex);
            }
            return retorno;
        }

        protected override void Guardar()
        {
            try
            {
                StringBuilder sb = new StringBuilder();
                if (!this.Validar(ref sb))
                {
                    this.MostrarMensajeValidacion(sb.ToString());
                    return;
                }
                PuntoTopografico puntotopografico = new PuntoTopografico();
                puntotopografico.CodigoPuntoTopografico = int.Parse(this.txtCodigo.Text);
                //puntotopografico.CodigoLabor = int.Parse(this.hidCodigoLabor.Value);
                puntotopografico.Nombre = this.txtNombre.Text;
                puntotopografico.Este = double.Parse(this.txtEste.Text);
                puntotopografico.Norte = double.Parse(this.txtNorte.Text);
                puntotopografico.CotaTecho = double.Parse(this.txtCotaTecho.Text);
                puntotopografico.CotaPiso = double.Parse(this.txtCotaPiso.Text);
                puntotopografico.Observacion = this.txtObservacion.Text;
                puntotopografico.CodigoUnidad = int.Parse(this.ddlUnidadMinera.SelectedValue.ToString());

                if (this.hidCodigoLabor.Value == "0")
                    puntotopografico.CodigoLabor = null;
                else
                    puntotopografico.CodigoLabor = int.Parse(this.hidCodigoLabor.Value.ToString());
                //puntotopografico.Descripcion = this.txtDescripcion.Text;

                using (var proxy = new SEPuntoTopograficoClient("BasicHttpBinding_ISEPuntoTopografico"))
                {
                    if (this.hidCodigo.Value.CompareTo("0") == 0)

                        proxy.InsertarPuntoTopografico(puntotopografico);

                    else

                        proxy.ModificarPuntoTopografico(puntotopografico);
                }
                this.MostrarMensaje(MSG_OK_GRABAR);
                this.mpRegistro.Hide();
                Listar();
            }
            catch (Exception ex)
            {
                MostrarMensajeValidacion(MSG_ERROR_GRABAR);
                Logger.Error("frmPuntoTopografico:Guardar", ex);
            }
        }
        #endregion

        #region Eventos


        protected void rgLista_DeleteCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                string codigoPuntoTopografico = ((GridDataItem)e.Item).GetDataKeyValue("CodigoPuntoTopografico").ToString();
                using (var proxy = new SEPuntoTopograficoClient("BasicHttpBinding_ISEPuntoTopografico"))
                {
                    proxy.EliminarPuntoTopografico(int.Parse(codigoPuntoTopografico));
                }
                this.Listar();
                this.MostrarMensaje(MSG_OK_ELIMINAR);
            }
            catch (Exception ex)
            {
                this.MostrarMensaje(MSG_ERROR_ELIMINAR, enmTipoMensajeMostrar.Error);
                Logger.Error("frmPuntoTopografico:rgLista_DeleteCommand", ex);
            }
        }

        protected void imgClose_Click(object sender, ImageClickEventArgs e)
        {
            this.mpRegistro.Hide();
        }

        protected void rgLista_PageIndexChanged(object sender, GridPageChangedEventArgs e)
        {
            this.Listar();
        }

        protected void rgLista_PageSizeChanged(object sender, GridPageSizeChangedEventArgs e)
        {
            this.Listar();
        }

        protected void rgLista_SortCommand(object sender, GridSortCommandEventArgs e)
        {
            this.Listar();
        }

        protected void rgLista_ItemCommand(object sender, GridCommandEventArgs e)
        {
            if (e.CommandName.CompareTo("Editar") == 0)
            {
                //Editar
                var item = (GridEditableItem)e.Item;
                int codigoPuntoTopografico = int.Parse(item.GetDataKeyValue("CodigoPuntoTopografico").ToString());
                MostrarDetalle(codigoPuntoTopografico, enmAccionRealizar.Edicion);
            }

            if (e.CommandName.CompareTo("Ver") == 0)
            {
                //Ver solo lectura
                var item = (GridEditableItem)e.Item;
                int codigoPuntoTopografico = int.Parse(item.GetDataKeyValue("CodigoPuntoTopografico").ToString());
                MostrarDetalle(codigoPuntoTopografico, enmAccionRealizar.Ver);
            }

            if (e.CommandName == RadGrid.FilterCommandName)
            {
                Listar();
            }
        }

        protected void ibtnExportar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                Listar();
                string alternateText = "ExcelML";
                this.rgLista.ExportSettings.Excel.Format = (GridExcelExportFormat)Enum.Parse(typeof(GridExcelExportFormat), alternateText);
                this.rgLista.ExportSettings.IgnorePaging = true;
                this.rgLista.ExportSettings.ExportOnlyData = true;
                this.rgLista.ExportSettings.OpenInNewWindow = true;
                this.rgLista.MasterTableView.ExportToExcel();
            }
            catch (Exception ex)
            {

                Logger.Error("frmPuntoTopografico:ibtnExportar_Click", ex);
            }
        }

        protected void ibtnRegistrar_Click(object sender, ImageClickEventArgs e)
        {
            MostrarDetalle(0, enmAccionRealizar.Nuevo);
        }


        protected void ibtnGuardar_Click(object sender, ImageClickEventArgs e)
        {
            Guardar();
        }

        protected void ibtnCancelar_Click(object sender, ImageClickEventArgs e)
        {
            this.mpRegistro.Hide();
        }

        #endregion

        protected void ibtnAutocad_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                //Invoca a la libreria que lee Autocad
                this.txtEste.Text = string.Format("{0:###0.00}", "789.4");
                this.txtNorte.Text = string.Format("{0:###0.00}", "456");

            }
            catch (Exception ex)
            {

                Logger.Error("frmPuntoTopografico:ibtnAutocad_Click", ex);
            }
        }
    }
}